﻿#define _CRT_SECURE_NO_WARNINGS 1
/*题目描述
按照给定小菱形的数量n，利用字符打印菱形，要求

只使用/，\,空格，回车四种字符。
行首无多余的空格，行末无空格。
菱形从上到下，从左到右，依次编码，从1到n，不要输出多余的菱形。
边长为a的大菱形，最少有(a−1)2+1个小菱形，最多有a2个小菱形。
具体格式见样例。

比如边长为3的菱形，最少有5个小菱形(左边的情况)，最多有9个小菱形（右边的情况）。

   /\      /\
  /\/\    /\/\
 /\/\/   /\/\/\
 \/\/    \/\/\/
          \/\/
           \/
对应的编号分别为

  1     1
 2 3   2 3
4 5   4 5 6
       7 8
        9
输入格式
存在多个样例，每个样例是一个整数n(1≤n≤100)。如果n为0，表示输入结束，这个样例不需要处理。

输出格式
依次按要求输出对应数量的菱形。*/
#include <stdio.h>//基本思路：该图形一定可以分解为上、下两个部分
#include <string.h>
#include <math.h>

int main() {
    int n;
    int s[25][25];
    while (scanf("%d", &n) != EOF) {
        memset(s, '\0', sizeof(s));//每次新循环开始都要将数组清空一次
        int i, j, k;
        int a, t = 0;
        a = ceil(sqrt((double)n));//ceil函数可将double型浮点数取整后加一，a表示边长
        int r = a * a + a;
        //1. 确定总行数
        for (i = a; i < 2 * a; i++) {
            if (n >= 2 * a * i - i * (i - 1) / 2 - r && n <= 2 * a * (i + 1) - i * (i + 1) / 2 - r) {
                //这里2 * a * i - i * (i - 1) / 2 - r是标准形态（整个图形是一个完整的菱形）下前i行菱形的总个数，可以用等差数列求和公式推出
                t = i + 1;//t即为总行数
                break;
            }
        }
        //2.分情况讨论
        //第一种：恰有（a + 1）行
        if (t == a + 1) {
            //再细分为两种
            //其一：第（a + 1）行刚好排满
            if (n == 2 * a * t - t * (t - 1) / 2 - r) {
                for (i = 1; i <= a; i++) {//前a行
                    for (j = 1; j <= 2 * i; j++) {
                        if (j % 2 != 0)s[i][j] = '/';
                        else s[i][j] = '\\';//'\'是特殊字符，打两个，第一个表转意
                    }
                }
                for (j = 1; j <= 2 * a; j++) {//最后一行
                    if (j % 2)s[t][j] = '\\';
                    else s[t][j] = '/';
                }
            }
            //其二：第（a + 1）行未满
            else {
                for (i = 1; i <= a; i++) {//前a行
                    for (j = 1; j <= 2 * i; j++) {
                        if (j % 2 != 0)s[i][j] = '/';
                        else s[i][j] = '\\';
                    }
                }
                s[a][2 * a] = '\0';//第a行最后一个清空
                for (j = 1; j <= 2 * (n - (2 * a * (t - 1) - (t - 1) * (t - 2) / 2 - r)); j++) {//第(a + 1)行
                    if (j % 2)s[t][j] = '\\';
                    else s[t][j] = '/';
                }
            }
        }
        //第二种：总行数大于（a + 1）
        else {
            for (i = 1; i <= a; i++) {//前a行
                for (j = 1; j <= 2 * i; j++) {
                    if (j % 2 != 0)s[i][j] = '/';
                    else s[i][j] = '\\';
                }
            }
            for (i = a + 1; i < t; i++) {
                for (j = 2 * (2 * a + 1 - i); j >= 1; j--) {
                    if (j % 2 != 0)s[i][j] = '\\';
                    else s[i][j] = '/';
                }
            }
            for (j = 1; j <= 2 * (n - (2 * a * (t - 1) - (t - 1) * (t - 2) / 2 - r)); j++) {//最后一行
                if (j % 2)s[t][j] = '\\';
                else s[t][j] = '/';
            }
        }
        //3.打印
        for (i = 1; i <= a; i++) {//打印前a行
            for (k = 1; k <= a - i; k++) {//打印空格
                printf(" ");
            }
            for (j = 1; s[i][j] != '\0'; j++) {//遇'\0'则换行
                printf("%c", s[i][j]);
            }
            printf("\n");
        }
        for (i = a + 1; i <= t; i++) {//打印第a行至最后一行
            for (k = 1; k <= i - a - 1; k++) {//打印空格
                printf(" ");
            }
            for (j = 1; s[i][j] != '\0'; j++) {//遇'\0'则换行
                printf("%c", s[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
